#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED 显示屏的宽度，以像素为单位
#define SCREEN_HEIGHT 64 // OLED 显示屏的高度，以像素为单位
#define OLED_RESET     -1 // 如果你的屏幕有复位引脚，请将其连接到 GPIO 并设置对应的引脚号

#define POTENTIOMETER_PIN 33  // 定义电位器连接的引脚为 GPIO33
#define X_PIN 34  // 定义 X 轴连接的引脚为 GPIO34
#define Y_PIN 35  // 定义 Y 轴连接的引脚为 GPIO35
#define SW_PIN 32 // 定义按钮连接的引脚为 GPIO32

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);  // 初始化串口通信，设置波特率为 115200

  // 初始化 I2C，指定 SDA 和 SCL 引脚
  Wire.begin(16, 17); // 使用 GPIO16 作为 SDA，GPIO17 作为 SCL

  // 初始化 OLED 显示屏
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C 是 I2C 地址
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // 如果初始化失败，则进入无限循环
  }

  // 清除屏幕内容
  display.clearDisplay();

  display.setTextSize(1);                     // 设置字体大小
  display.setTextColor(SSD1306_WHITE);         // 设置字体颜色为白色
  display.setCursor(0, 10);                   // 设置文本起始位置
  display.println(F("Initialization complete"));
  display.display();  // 将缓冲区内容显示到屏幕上

  pinMode(POTENTIOMETER_PIN, INPUT);  // 设置电位器引脚为输入模式
  pinMode(X_PIN, INPUT);  // 设置 X 轴引脚为输入模式
  pinMode(Y_PIN, INPUT);  // 设置 Y 轴引脚为输入模式
  pinMode(SW_PIN, INPUT_PULLUP);  // 设置按钮引脚为输入模式，并启用内部上拉电阻
}

void loop() {
  int xValue = analogRead(X_PIN);  // 读取 X 轴的模拟值
  int yValue = analogRead(Y_PIN);  // 读取 Y 轴的模拟值
  int swValue = digitalRead(SW_PIN);  // 读取按钮的数字值
  int sensorValue = analogRead(POTENTIOMETER_PIN);  // 读取电位器的模拟值
  float voltage = (sensorValue / 4095.0) * 3.3;  // 将读取值转换为电压值

  // 输出 X 轴、Y 轴和按钮的状态
  Serial.print("X: ");
  Serial.print(xValue);
  Serial.print(", Y: ");
  Serial.print(yValue);
  Serial.print(", Button: ");
  Serial.print(swValue);
  Serial.print(", Voltage: ");
  Serial.print(voltage);
  Serial.println(" V");

  // 清除屏幕内容
  display.clearDisplay();

  display.setTextSize(1);                     // 设置字体大小
  display.setTextColor(SSD1306_WHITE);         // 设置字体颜色为白色
  display.setCursor(0, 10);                   // 设置文本起始位置

  display.print("X: ");
  display.print(xValue);
  display.print(", Y: ");
  display.print(yValue);
  display.print(", Button: ");
  display.print(swValue);
  display.print(", Voltage: ");
  display.print(voltage);
  display.println(" V");

  display.display();  // 将缓冲区内容显示到屏幕上

  delay(500);  // 等待 500 毫秒再次读取
}
